CREATE PROCEDURE dbo.sp_InvertirAcumulacion

-- Parametros

@Expediente_Incorrecto varchar(20) ,
@Expediente_Correcto varchar(20) , 
@Cedula_Usuario int , -- viene negativo, se debe convertir a positivo
@Return int OUTPUT

AS

DECLARE 
@Errores int , 
@Equivale_a varchar(8000) , 
@Posicion int

SET @Errores = 0

SET XACT_ABORT ON
BEGIN TRANSACTION

-------------------------------------------
--  PASO 1 : Crea el Expediente Correcto --
-------------------------------------------
IF ( SELECT Expediente FROM Expediente WHERE Expediente = @Expediente_Correcto ) IS NOT NULL
	SET @Errores = 1

IF @Errores = 0
	BEGIN
	---------------------------------------------------------------
	-- PASO 1-a : Reemplaza el Expediente Correcto en Equivale_a --
	---------------------------------------------------------------
	SET @Equivale_a = ( SELECT Equivale_a FROM Expediente WHERE Expediente = @Expediente_Incorrecto )
	SET @Equivale_a = REPLACE( @Equivale_a , @Expediente_Correcto , @Expediente_Incorrecto )
	---------------------------------------
	-- PASO 1-b : Crea el nuevo registro --
	---------------------------------------
	INSERT Expediente SELECT @Expediente_Correcto , @Equivale_a , juzgado , parte , fecha_ing_pgr , perjudicado , 
		tipo_expediente , promovente , ( @Cedula_Usuario * -1 ) , Agotamiento_ViaAdministrativa , Tipo_Atencion , 
		InfPos_Consecutivo , InfPos_Mes , InfPos_Anio 
	FROM Expediente WHERE Expediente = @Expediente_Incorrecto
	IF @@error <> 0
		 SET @Errores = @Errores + 1
	END


-----------------------------------------------------------------------------------------
-- PASO 2 : Pasa las Notificaciones del @Expediente_Incorrecto al @Expediente_Correcto --
-----------------------------------------------------------------------------------------
IF @Errores = 0
	BEGIN
	DECLARE @Num_Copia tinyint , @Consecutivo int 
	DECLARE Consulta_Notificaciones CURSOR FOR
		SELECT 	Num_Copia , Consecutivo
		FROM 	Exp_Fecha 
		WHERE 	Expediente = @Expediente_Incorrecto
	OPEN Consulta_Notificaciones
	
	FETCH NEXT FROM Consulta_Notificaciones INTO @Num_Copia , @Consecutivo
	WHILE (@@fetch_status <> -1)
		BEGIN
		UPDATE Exp_Fecha SET Expediente = @Expediente_Correcto , Cedula_Usuario = ( @Cedula_Usuario * -1 )
			WHERE Num_Copia = @Num_Copia AND Consecutivo = @Consecutivo
		IF @@error <> 0
			SET @Errores = @Errores + 1
		FETCH NEXT FROM Consulta_Notificaciones INTO @Num_Copia , @Consecutivo
		END
	DEALLOCATE Consulta_Notificaciones
	END


---------------------------------------------------------------------------------------
-- PASO 3 : Pasa los Procuradores del @Expediente_Incorrecto al @Expediente_Correcto --
---------------------------------------------------------------------------------------
IF @Errores = 0
	BEGIN
	DECLARE @Procurador tinyint , @Primario_Chk CHAR(1)
	DECLARE Consulta_Procurador_0 CURSOR FOR
		SELECT 	Procurador , Primario_Chk 
		FROM 	Procuradores_X_Expediente 
		WHERE 	Expediente = @Expediente_Incorrecto
	OPEN Consulta_Procurador_0
	
	FETCH NEXT FROM Consulta_Procurador_0 INTO @Procurador , @Primario_Chk
	WHILE (@@fetch_status <> -1)
		BEGIN
		UPDATE Procuradores_X_Expediente SET Expediente = @Expediente_Correcto , Cedula_Usuario = ( @Cedula_Usuario * -1 )
			WHERE Expediente = @Expediente_Incorrecto AND Procurador = @Procurador AND Primario_Chk = @Primario_Chk
		IF @@error <> 0
			SET @Errores = @Errores + 1
		FETCH NEXT FROM Consulta_Procurador_0 INTO @Procurador , @Primario_Chk
		END
	DEALLOCATE Consulta_Procurador_0
	END

	
-----------------------------------------------------------------------------------------------------
-- PASO 4 : Pasa las Instituciones Involucradas del @Expediente_Incorrecto al @Expediente_Correcto --
-----------------------------------------------------------------------------------------------------
IF @Errores = 0
	BEGIN
	DECLARE @Institucion smallint 
	DECLARE Consulta_Institucion_0 CURSOR FOR
		SELECT 	InstitucionInvolucrada 
		FROM 	Instituciones_X_Expediente 
		WHERE 	Expediente = @Expediente_Incorrecto
	OPEN Consulta_Institucion_0
	
	FETCH NEXT FROM Consulta_Institucion_0 INTO @Institucion
	WHILE (@@fetch_status <> -1)
		BEGIN
		UPDATE Instituciones_X_Expediente SET Expediente = @Expediente_Correcto , 
						Cedula_Usuario = ( @Cedula_Usuario * -1 )
			WHERE Expediente = @Expediente_Incorrecto AND InstitucionInvolucrada = @Institucion
		IF @@error <> 0
			SET @Errores = @Errores + 1
		FETCH NEXT FROM Consulta_Institucion_0 INTO @Institucion
		END
	DEALLOCATE Consulta_Institucion_0
	END


------------------------------------------------
-- PASO 5 : Elimina el @Expediente_Incorrecto --
------------------------------------------------
IF @Errores = 0
	BEGIN
	UPDATE Expediente SET Cedula_Usuario = ( @Cedula_Usuario * -1 ) WHERE Expediente = @Expediente_Incorrecto
	IF @@error <> 0
		SET @Errores = @Errores + 1
	DELETE Expediente WHERE Expediente = @Expediente_Incorrecto
	IF @@error <> 0
		SET @Errores = @Errores + 1
	END


-----------------------------------------------------------------------------
-- PASO 6 : Afirma o Reversa la transaccion dependiendo de si hubo errores --
-----------------------------------------------------------------------------
IF @Errores = 0
	BEGIN
	COMMIT TRANSACTION
	SET @Return = 0		-- para indicar que NO hubo errores
	END
ELSE
	BEGIN
	ROLLBACK TRANSACTION
	SET @Return = -1	-- para indicar que SI hubo errores
	END 

SET XACT_ABORT OFF

SELECT @Return 
RETURN
